package logica;

import logica.pisos.Piso;

/**
 * Clase Nivel: modela el mapa del juego,mantiene todos los pisos, y estos últimos a su vez son los que contienen 
 * sobre ellos objetos oleccionables, premios y obstáculos.  
 * @author Amorosi, Javier (94528)
 * @author Antiman, Nehuen (102440)
 */
public class Nivel {
	
	private Piso pisoInicial;
	private Piso pisoFinal;
	private Piso [] [] grilla;
	
	
	/**
	 * Constructor de la clase Nivel, 
	 * @param f cantidad de filas que contienen el nivel.
	 * @param c cantidad de columnas que contiene el nivel.
	 */
	public Nivel(int f,int c){
		grilla = new Piso [f] [c];
		pisoFinal  = null;
	}
	
	/**
	 * Dado un piso esta operación lo ubica en la fila y columna dada.
	 * @param p Piso a ubicar.
	 * @param f fila a ubicar.
	 * @param c columna a ubicar. 
	 */
	public void setPiso(Piso p,int f, int c){
		grilla[f][c] = p;
	}
	
	/**
	 * Setea el piso final del nivel. 
	 * @param p piso final.
	 */
	public void setPisoFinal(Piso p){
		pisoFinal = p;
	}
	
	/**
	 * Setea el piso inicial del nivel. 
	 * @param p piso inicial.
	 */
	public void setPisoInicial(Piso p){
		pisoInicial = p;
	}
	
	/**
	 * Retorna el piso ubicado en la posición (f, c).
	 * @param f fila.
	 * @param c columna. 
	 * @return piso ubicado en la posición (f, c).
	 */
	public Piso getPiso(int f,int c){
		Piso toR = null;
		if(estaEnRango(f,c))
			toR=grilla[f][c];
		return toR;
	}
	
	public Piso getPisoInicial(){
		return pisoInicial; 
	}
	
	/**
	 * Retorna un valor booleando indicando si el la posición (f,c) es una posición válida en el nivel.
	 * @param f fila.
	 * @param c columna.
	 * @return true si (f, c) es posición válida en el nivel, false caso contrario.
	 */
	public boolean estaEnRango(int f, int c){
		return f<grilla.length && c<grilla[0].length && f>=0 && c>=0;
	}
	
	/**
	 * Retorna el número de filas que tiene el nivel.
	 * @return número de filas que tiene el nivel.
	 */
	public int getFilas(){
		return grilla.length;
	}
	
	/**
	 * Retorna el número de columnas que tiene el nivel.
	 * @return número de columnas que tiene el nivel.
	 */
	public int getColumnas(){
		return grilla[0].length;
	}
	
	/**
	 * Retorna valor booleando indicando si el piso pasado por parámetro es o no el piso final.
	 * @param p un Piso.
	 * @return true si p es el piso final del nivel, false caso contrario. 
	 */
	public boolean esPisoFinal(Piso p){
		return (p==pisoFinal);
	}
}
